home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / glass / glass.lha / GLASS / glammar / ge22.c < prev    next >
C/C++ Source or Header  |  1991-01-21  |  7KB  |  287 lines

  1. /*
  2.  
  3.     This file is a part of the GLAMMAR source distribution 
  4.     and therefore subjected to the copy notice below. 
  5.     
  6.     Copyright (C) 1989,1990  Eric Voss, ericv@cs.kun.nl 
  7.  
  8.     This program is free software; you can redistribute it and/or modify
  9.     it under the terms of the GNU General Public License as published by
  10.     the Free Software Foundation version 1
  11.  
  12.     This program is distributed in the hope that it will be useful,
  13.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.     GNU General Public License for more details.
  16.  
  17.     You should have received a copy of the GNU General Public License
  18.     along with this program; if not, write to the Free Software
  19.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20. */
  21. #include "ge1.h"
  22. #ifdef LOOP
  23. void loop_line_mode (rroot)
  24. void (*rroot)();
  25. {
  26.    affix *raf = af;
  27.    char * rc =c;
  28.    if (!ll_mode) {(*rroot)(); return; }
  29.    ip = input;
  30.    do {
  31.       *ip++ = getc(inputfile);
  32.       nrofchars += 1;
  33.       if (*(ip-1) == '\n' ) {
  34.          int pcount = parsecount;
  35.          limitip = ip;
  36.          mip = input;
  37.          *(ip-1) = '\0';
  38.          *ip = '\n';
  39.          ip = input;
  40.          (*rroot)();
  41.          if (parsecount == pcount)
  42.             fprintf(stderr, "error on line %d, input = `%s' \n", set_line_num,
  43.                 input,q);
  44.          ip = input;
  45.          nrofchars = 0;
  46.          set_line_num+=1;
  47.          if ((set_line_num == 2) && (ll_count != 0)) {
  48.             fprintf(stderr, "root = %x' \n", rroot);
  49.       /*    rroot = uloop;   */
  50.             fprintf(stderr, "root = %x' \n", rroot);
  51.          }
  52.          q -=1; c = rc ; af = raf;
  53.       }
  54.    }  while ( !feof(inputfile) ) ;
  55.        exit(0);
  56. }
  57. #endif
  58.  
  59. #ifdef ERMSG  
  60. int errline(b,e)
  61. char *b,*e;
  62. {
  63.    if (b> e) {
  64.       return;
  65.    }
  66.    if (e > (b+75) ) {
  67.       b = e -75;
  68.       fprintf (stderr,"@");
  69.    }
  70.    while (b<=e)
  71.       fprintf (stderr,"%c",*b++);
  72.    fprintf (stderr,"\n",*b++);
  73. }
  74.  
  75. int underline(b,e)
  76. char *b,*e;
  77. {
  78.    if (b> e) {
  79.         fprintf(stderr,"\n^(012)\n");
  80.       return;
  81.    }
  82.    if (e> b+75) 
  83.       b = e -76;
  84.     for (; b <= e; b++) {
  85.        if (b == mip) {
  86.         int o = *mip;
  87.         o &= 255;
  88.         fprintf(stderr,"^(%o)\n",o);
  89.         break;
  90.        }
  91.        else if (*b == '\t')
  92.         fprintf(stderr,"\t");
  93.        else  fprintf(stderr,"-");
  94.     }
  95.           
  96. }
  97. int errmsg()
  98. {
  99.    char *beginmsg,*endmsg;
  100.    int linenumber = 1;
  101.  
  102.    if (emsg_count >0) 
  103.       return(1);
  104.  
  105.    if (parsecount != 0) {
  106.       if (output_to_stdout)  {
  107.          fclose(stdout);
  108.       } else {
  109.          putc('\012',output);
  110.          fclose(output);
  111.       }
  112.       return(exit_code);
  113.    }
  114.  
  115.    /* say file */
  116.  
  117.    if (*current_file_name != '\0')
  118.       fprintf (stderr,"\n*** file: %s\n", current_file_name);
  119.  
  120.    if (rmax >0 )
  121.       fprintf(stderr, "\n*** While parsing \"%s\"\n",error_msg);
  122.  
  123.    if (*mip == '\0') {
  124.       fprintf(stderr, "*** Syntax error after EOF\n");
  125.       return(1);
  126.    }
  127.  
  128.    /* say line number */
  129.    { 
  130.      char *count;
  131.    if ((mip > limitip )  || (mip < input) ) {
  132.       fprintf(stderr, "*** glammar compiler error in \"errmsg\"\n\
  133.      failed to compute linenumber\n");
  134.       exit(1);
  135.    }
  136.    linenumber = set_ip_start_num;
  137.    for (count = set_ip_start_pos; count < mip;)
  138.       if (*count++ == '\n')
  139.          linenumber += 1;
  140.    if (*count == '\n')
  141.       linenumber += 1;
  142.  
  143.    fprintf(stderr, "*** Syntax error on line %d:\n", linenumber);
  144.    }
  145.    /* print line before erroneous line,  max 76 chars */
  146.  
  147.    if (linenumber > 1)  {
  148.       for (beginmsg = mip; *beginmsg-- != '\n';) ;
  149.       endmsg = beginmsg;
  150.       for (; *beginmsg-- != '\n';) ;
  151.       beginmsg +=2;
  152.       errline(beginmsg,endmsg);
  153.       beginmsg = endmsg+2;
  154.    }
  155.    else beginmsg = input;
  156.  
  157.  
  158.    /* print errline */
  159.    endmsg = mip;
  160.    while (*endmsg != '\0')
  161.       if (*endmsg++ == '\n') {
  162.          endmsg -=2;
  163.          break;
  164.       }
  165.    errline (beginmsg,endmsg);
  166.    underline (beginmsg,endmsg);
  167.  
  168.    /* print line after error line*/
  169.   endmsg +=2;
  170.   beginmsg = endmsg;
  171.    if (*endmsg != '\0')  {
  172.       while (*endmsg)
  173.          if (*endmsg++ == '\n') {
  174.             endmsg -=2;
  175.             break;
  176.          }
  177.    }
  178.    errline (beginmsg,endmsg);
  179.    return(1);
  180. }
  181.  
  182. void             result() {
  183.   if (emsg_count >0) return;
  184.   if (report_stacksize) {
  185.     int             stack_size;
  186.     stack_size = stack_bottum - (int) &stack_size;
  187.     fprintf (stderr, "\nHere is how much storage glammar used:\n");
  188.     fprintf(stderr, "eval count = %d\n", eval_count);
  189.     fprintf(stderr, 
  190. "backtrack stack size = %dk (out of ?), increase with csh command limit()\n", 
  191.            (stack_size >> 10) + 1);
  192.     fprintf(stderr, 
  193.   "char stack size  = %dk (out of %dk), increase with -cn (1 = 512k)\n", 
  194.               (((long) c - (long) cstore) >> 10) + 1,
  195.               ( cssize >> 10) + 1);
  196.     fprintf(stderr, 
  197.   "affix stack size  = %dk (out of %dk), increase with -hn (1 = 6m)\n",  
  198.           (((long) af - (long) affix_heap) >> 10) + 1,
  199.               ((afhsize*12) >> 10) + 1);
  200.   }
  201.   if (output == 0) {
  202.     if (output_to_stdout)
  203.       output = stdout;
  204.     else
  205.       output = fopen(out_file_name, "w");
  206.   }
  207.   printa(output, q->a);
  208.   fflush(output);
  209. }
  210. #endif     
  211.  
  212. #ifdef PRINTA
  213. void             printa(outdir, afx)
  214. register AFFIX afx;
  215. FILE           *outdir;
  216. {
  217.   register char * cp ;
  218. tailrecel:
  219.   if (afx == nil)
  220.     return;
  221.   cp = afx ->t;
  222.   if (cp == fast_list_acces) {
  223.     fprintf(outdir, "!<LNODE_%d>!", afx->r);
  224.     return;
  225.   }
  226.   if (cp == undefined) {
  227.     fprintf(outdir, "!@!");
  228.     return;
  229.   }
  230.   if (cp != empty) {
  231.     if (*cp ==  '\001' || *cp == '\002') 
  232.       fprintf(outdir, "!<%x>!%s", cp+1,cp+6);
  233.     else fprintf(outdir, "%s", afx->t);
  234.   }
  235.   printa(outdir, afx->l);
  236. /*  printa(outdir, afx->r); */
  237.   afx = afx ->r;
  238.   goto tailrecel;
  239. }
  240.  
  241. void sprinta(afx)
  242. register AFFIX afx;
  243. {
  244.   register char  *cp, *rc;
  245. tailrecel:
  246.   if (afx == nil)
  247.     return;
  248.   cp = afx -> t;
  249.   if (cp == fast_list_acces) {
  250.     fprintf(stderr, "system error: evaluating list node\n");
  251.     exit(1);
  252.   }
  253.   if (cp == undefined) {
  254.        if (rmax > 0) 
  255.           fprintf(stderr, "==> %d :\n", rmax);
  256.        fprintf(stderr, "Glammar message:\nIn sprinta (\"%s\"): trying to evaluate uninstantiated affix.\n",cp);
  257.       parsecount = 0;
  258.       errmsg();
  259.       exit (1); 
  260.       
  261.   }
  262.   if (cp != empty) {
  263.     eval_count += 1;
  264.     for (rc = c; *cp != '\0'; )
  265.           if (*cp ==  '\001' || *cp == '\002')  {
  266.                  *rc = *cp;
  267.                  *(rc+1) = *(cp+1);
  268.                  *(rc+2) = *(cp+2);
  269.                  *(rc+3) = *(cp+3);
  270.                  *(rc+4) = *(cp+4);
  271.                  *(rc+5) = *(cp+5);
  272.                  cp +=6; rc +=6;
  273.           } else *rc++ = *cp++;
  274.  
  275.     c = rc;
  276.     if (rc > cstore_top) cstore_overflow(); 
  277.   }
  278.   sprinta((*afx).l);
  279.  
  280. /*   sprinta((*afx).r);   tail recursion eliminations */
  281.   afx = afx ->r;
  282.   goto tailrecel;
  283.  
  284. }
  285. #endif
  286.  
  287.